﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using daStaticAnalyser.Analysers;
using daStaticAnalyser;
using daBase.Analyser;
using daSyntaxAnalyser.SyntaxTree;

namespace DifferentAnalizers
{
    /// <summary>
    /// Анализатор - пустое тело блока кода (begin end / try except / etc)
    /// </summary>
    [AnalyserDefaultSettings("Пустой блок кода.", "Пустой блок кода!", 40, "Пустой блок кода свидетельствует о недоработке кода. Устраните его или оставьте комментарий (в некоторых случаях действительно без пустого блока кода не обойтись).")]
    public class EmptyBodyAnalyser : BaseStaticAnalyser
    {
        /// <summary>
        /// Считать откомментированные пустые блоки допустимыми
        /// </summary>
        [Category("Особые")]
        [DisplayName("Исключать откомментированные")]
        [Description("Если блок кода имеет комментарий, то он считается допустимым.")]
        public bool GoodIfComment { get { return (settings as EmptyBodySettings).GoodIfComment; } set { (settings as EmptyBodySettings).GoodIfComment = value; } }

        /// <summary>
        /// Инициализация
        /// </summary>
        protected override void Init()
        {
            if (settings == null)
                settings = new EmptyBodySettings();
            (settings as EmptyBodySettings).GoodIfComment = false;
            base.Init();
        }

        /// <summary>
        /// Собственно анализ
        /// </summary>
        /// <param name="e">параметр анализа</param>
        protected override void DoAnalyse(SyntaxTreeArgs e)
        {
            if (e.Element is CompoundStatementElement)
            {
                CompoundStatementElement compound = (e.Element as CompoundStatementElement);
                if ((compound.Statements.Count == 0) && (!(settings as EmptyBodySettings).GoodIfComment || (compound.Comments == null) || (compound.Comments.Count == 0)))
                    AddError(compound.StartInfo, e.Element.ToString());
            }
        }
    }
}
